ROOT logo
//*-- AUTHOR : Jochen Markert

//_HADES_CLASS_DESCRIPTION 
///////////////////////////////////////////////////////////////////////////////
//
// HMdcVertexWriter
//
// This class writes the reconstructed Event vertex to an root output file
// which will be later used for the preparation of the simulations files for
// the event embeddding. The class has to connect last to the task list to not
// write out skipped events.
//
// Output file name :
// 1. If the outputfile is set in HADES it will be equal outputfile_vertex.root.
//    The file will be splitted in the same way as the the root output file.
// 2. If the outputdir is set filenames are derived in the same way but the dir
//    corresponds to the set one.
// 3. If no outputdir is set and no output file is set in HADES the outputfile
//    will be equal to the current inputfile_vertex.root
// 4. if setOutputFile( filename_includingpath) is used all automatic derivation
//    from HADES input or outputfile name is disabled (manual mode, use this when
//    running from HRootSource)
//
//  static void HMdcVertexWriter::setSkipNoVertex (Bool_t skip = kTRUE){doSkipNoVertex = skip; }
//  With doSkipNoVertex == kTRUE (default : kTRUE) events without calculated vertex will be skipped.
//
//  with setVertexType(Int_t type)
//  kVertexCluster  = 1,(cluster finder vertex (mean middle of target segment position in z, x,y on 0,0))
//  kVertexSegment  = 2 (Mdc inner segments used to estimated the vertex,default),
//  kVertexParticle = 3 (fully reconstructed and sorted HParticleCand used to estimate the vertex),
//  kVertexClusterMeanXY = 4 (user provided mean x,y, z from vertexCluster)
//  kVertexGeant         = 5 (use primary vertex from HGeant)
//  the reconstructed vertex type can be selected.
//  with void setUserSelectionEvent(Bool_t (*function)(TObjArray* ),TObjArray* params=0) the user
//  can set a event selection function of the form
//
//  Bool_t myEventSelection(TObjArray* params){
//
//   if(goodEvent) return kTRUE;
//   else          return kFALSE;
// }
//
//  where params cand be used to pass parameters for the used
//  event selection. The event selection should be used in combination
//  with setSkipNoVertex(kTRUE)
//////////////////////////////////////////////////////////////////////////////

#include "hmdcvertexwriter.h"
#include "hades.h"
#include "hevent.h"
#include "heventheader.h"
#include "hcategorymanager.h"
#include "hdatasource.h"
#include "hcategory.h"
#include "hgeantkine.h"
#include "hgeantdef.h"


#include "TFile.h"
#include "TSystem.h"

#include <iostream> 
#include <iomanip>
#include <stdlib.h>



ClassImp(HMdcVertexWriter)

Bool_t  HMdcVertexWriter::doSkipNoVertex = kTRUE;
Int_t   HMdcVertexWriter::vertextype     = 2; // segments
Double_t HMdcVertexWriter::fMeanX        = -1000.;
Double_t HMdcVertexWriter::fMeanY        = -1000.;

HMdcVertexWriter::HMdcVertexWriter(void)
{
    // Default constructor .
    outfile       = NULL;
    vertex        = NULL;
    filename      = "";
    outputdir     = "";
    fileNameFromInput = kTRUE;
    fileNameManual    = kFALSE;
    isEmbedding       = kFALSE;
    pUserSelectEvent  = NULL;
    pUserParams       = NULL;
}
HMdcVertexWriter::HMdcVertexWriter(const Text_t* name,const Text_t* title)
:  HReconstructor(name,title)
{
    // Constructor calls the constructor of class HReconstructor with the name
    // and the title as arguments.
    outfile       = NULL;
    vertex        = NULL;
    filename      = "";
    outputdir     = "";
    fileNameFromInput = kTRUE;
    fileNameManual    = kFALSE;
    isEmbedding       = kFALSE;
    pUserSelectEvent  = NULL;
    pUserParams       = NULL;
}

HMdcVertexWriter::~HMdcVertexWriter(void) {
  // destructor close output if still open

    if (outfile){
        vertex ->Write();
	outfile->Close();
	outfile = NULL;
	vertex  = NULL;
    }
}

Bool_t HMdcVertexWriter::init(void)
{
    // init the ascii io ofstream with filename
    // taken from the current file of the data source
    // The file name will be checked inside the eventloop
    // against the HADES outputfile.


    //---------------------------------------------
    // now we have to finde the outputfile name
    // in the init function we have no access to
    // the outputfile name of hades (it will be created
    // after init). We take the file name from the datasource
    // end check in the eventloop if the file name has changed

    HDataSource* datasource = gHades->getDataSource();
    Bool_t  isROOT= kFALSE;
    TString type = gHades->getDataSource()->ClassName();
    if(type.CompareTo("HRootSource") == 0) isROOT=kTRUE;

    if(isROOT && !fileNameManual) {

	Error("HMdcVertexWriter::init()","Use setOutputFile(TString file = "") to define outputfile manual when running from HRootSource !");
	exit(1);

    }


    TString fname    = "";
    TString fullname = "";
    TString dir      = "";

    if(!isROOT && !fileNameManual){
	if(datasource){

	    filename = datasource->getCurrentFileName();

	    if(filename.Last('.') >= 0 )
	    {
		filename.Replace(filename.Last('.'),filename.Length() - filename.Last('.'),"_vertex.root");
		fname = gSystem->BaseName(filename.Data());
	    } else {
		Error("HMdcVertexWriter::init()","Could not retrieve current input file name = %s ! Something seems to be wrong!",filename.Data());
		exit(1);
	    }
	} else {
	    Error("HMdcVertexWriter::init()","Retrieve NULL pointer for datasource!");
	    exit(1);
	}

	if(outputdir != ""){ // replace path by outputdir
	    dir = outputdir;
	    fullname = dir + "/" + fname;
	} else {
	    dir = filename;

	    if(dir.Last('/') >= 0){
		// if filename contains a path.
		dir.Replace(dir.Last('/') + 1,dir.Length() - filename.Last('/') + 1,"");
	    } else {
		dir = gSystem->WorkingDirectory();
	    }

	    fullname = filename;
	}
	filename = fullname;
	filename.ReplaceAll("//","/");
    } else {
        filename=Form("%s/%s",outputdir.Data(),filename.Data());
        dir = outputdir;
    }


    Bool_t check = gSystem->AccessPathName(dir.Data(), kWritePermission);
    if(check == kFALSE)
    {   // inverse logic !!!
	outfile = new TFile(filename.Data(),"RECREATE");
	if(!outfile){
	    Error("HMdcVertexWriter::init()","Retrieve NULL for root output file = %s!",filename.Data());
	    exit(1);
	}
        outfile->cd();
	vertex = new TNtuple("vertex","vertex","vX:vY:vZ:seqNumber");

    } else {
	Warning("HMdcVertexWriter::init()","No Permission to write outputfile file = %s! \n Will try with outputfile name!",filename.Data());
    }
    //---------------------------------------------

    // find out if we are running embedding
    HCategory* catKine = (HCategory*)gHades->getCurrentEvent()->getCategory(catGeantKine);
    if(catKine && gHades ->getEmbeddingMode() > 0) {
	isEmbedding   = kTRUE;
    }

    return kTRUE;
}
Int_t HMdcVertexWriter::execute(void)
{
    // check if the root output file should be changed (taking
    // the file name from the HADES out put file). The coordinates
    // of the Event Vertex will be written to the root file output.


    //---------------------------------------------
    // Now we have to check if the outputfile name
    // has changed (due to file splitting)
    // Only needed if output is enabled otherwise
    // we have taken the input file name from the data source
    if(gHades->getOutputFile() && !fileNameManual)
    {
	if(fileNameFromInput && outfile){
	    // we have to close and remove the old file
	    // if we now want to use the output file name
	    // convention
	    outfile->cd();
	    vertex ->Write();
	    delete vertex;
	    outfile->Close();
	    gSystem->Exec(Form("rm %s",filename.Data()));
	    vertex  = NULL;
            outfile = NULL;
	}
	TString dir      = "";
        TString fname    = "";
        TString fullname = "";

	TString currentfile = gHades->getOutputFile()->GetName();

	if(currentfile.Last('.') >= 0 )
	{
	    currentfile.Replace(currentfile.Last('.'),currentfile.Length() - currentfile.Last('.'),"_vertex.root");
	}

	if(outputdir != ""){
	    fname = gSystem->BaseName(filename.Data());
	    fullname = outputdir + "/" + fname;
            fullname.ReplaceAll("//","/");
	}


	if(fullname.CompareTo(filename.Data()) != 0)
	{
	    // filename changed

	    filename = fullname;
	    if(outfile){
		// close old file
		outfile->cd();
		vertex  ->Write();
		delete vertex;
		outfile ->Close();
		vertex  = NULL;
		outfile = NULL;
	    }

	    outfile = new TFile(filename.Data(),"RECREATE");
	    if(!outfile){
		Error("HMdcVertexWriter::init()","Retrieve NULL for root output file = %s!",filename.Data());
		exit(1);
	    }
	    outfile->cd();
	    vertex = new TNtuple("vertex","vertex","vX:vY:vZ:seqNumber");

	}
	fileNameFromInput = kFALSE;
    } else {

	if(!outfile){
	    Error("HMdcVertexWriter::execute()","Could not create filename from  output and input file !");
	    exit(1);
	}


    }
    //---------------------------------------------
    if(outfile){
	HEvent* event = gHades->getCurrentEvent();
	if(event){
	    HEventHeader* header = event ->getHeader();
	    if(header){
                HVertex event_vertex ;
                if(vertextype == 1)  event_vertex = header->getVertexCluster();
                if(vertextype == 2)  event_vertex = header->getVertex();
                if(vertextype == 3)  event_vertex = header->getVertexReco();
                if(vertextype == 4)  event_vertex = header->getVertexCluster();

		if(vertextype == 5)
		{
		    //--------------------------------------------------------------
		    // retrive the vertex form first primary kine particle
		    HGeantKine* kine;
		    Float_t vx,vy,vz;

		    HCategory* kineCat = HCategoryManager::getCategory(catGeantKine);
		    if(!kineCat) {
                        Error("execute()","No catGeantKine in current Event! Cannot extract vertex from HGeantKine.");
			return 0;
		    }

		    Int_t n = kineCat->getEntries();
		    for(Int_t j = 0; j < n; j ++){
			kine = HCategoryManager::getObject(kine,kineCat,j);
			if(kine) {
			    if(kine->isPrimary())
			    {
				kine->getVertex(vx,vy,vz);
				if(doSkipNoVertex)
				{
				    Bool_t acceptedEvent = kTRUE;
				    if(pUserSelectEvent){
					acceptedEvent=(*pUserSelectEvent)(pUserParams);
				    }

				    if(acceptedEvent)vertex->Fill(vx,vy,vz,header->getEventSeqNumber());
				} else {
				    vertex->Fill(vx,vy,vz,header->getEventSeqNumber());
				}
                                break;
			    }
			}
		    }
		    //------------------------------------------------------------

		} else {
		    Double_t x,y,z;
		    x = event_vertex.getX();
		    y = event_vertex.getY();
		    z = event_vertex.getZ();

		    if(vertextype == 4){
			x = fMeanX;
			y = fMeanY;
		    }


		    if(doSkipNoVertex)
		    {
			Bool_t acceptedEvent = kTRUE;
			if(pUserSelectEvent){
			    acceptedEvent=(*pUserSelectEvent)(pUserParams);
			}
			// write only if a vertex has been
			// calculated
			if(event_vertex.getX() != -1000 &&
			   event_vertex.getY() != -1000 &&
			   event_vertex.getZ() != -1000 &&
			   acceptedEvent
			  )
			{
			    vertex->Fill(x,y,z,
					 header->getEventSeqNumber()
					);
			}

		    } else {
			// fill allways
			vertex->Fill(x,y,z,
				     event_vertex.getZ(),
				     header->getEventSeqNumber()
				    );
		    }
		}
	    }
	}
    }

    return 0;
}
Bool_t HMdcVertexWriter::finalize(void)
{
    // close the root file ouput

    if(outfile) {
	outfile->cd();
        vertex ->Write();
        delete vertex;
	outfile->Close();
	outfile = NULL;
        vertex  = NULL;
    }
    return kTRUE;
}

 hmdcvertexwriter.cc:1
 hmdcvertexwriter.cc:2
 hmdcvertexwriter.cc:3
 hmdcvertexwriter.cc:4
 hmdcvertexwriter.cc:5
 hmdcvertexwriter.cc:6
 hmdcvertexwriter.cc:7
 hmdcvertexwriter.cc:8
 hmdcvertexwriter.cc:9
 hmdcvertexwriter.cc:10
 hmdcvertexwriter.cc:11
 hmdcvertexwriter.cc:12
 hmdcvertexwriter.cc:13
 hmdcvertexwriter.cc:14
 hmdcvertexwriter.cc:15
 hmdcvertexwriter.cc:16
 hmdcvertexwriter.cc:17
 hmdcvertexwriter.cc:18
 hmdcvertexwriter.cc:19
 hmdcvertexwriter.cc:20
 hmdcvertexwriter.cc:21
 hmdcvertexwriter.cc:22
 hmdcvertexwriter.cc:23
 hmdcvertexwriter.cc:24
 hmdcvertexwriter.cc:25
 hmdcvertexwriter.cc:26
 hmdcvertexwriter.cc:27
 hmdcvertexwriter.cc:28
 hmdcvertexwriter.cc:29
 hmdcvertexwriter.cc:30
 hmdcvertexwriter.cc:31
 hmdcvertexwriter.cc:32
 hmdcvertexwriter.cc:33
 hmdcvertexwriter.cc:34
 hmdcvertexwriter.cc:35
 hmdcvertexwriter.cc:36
 hmdcvertexwriter.cc:37
 hmdcvertexwriter.cc:38
 hmdcvertexwriter.cc:39
 hmdcvertexwriter.cc:40
 hmdcvertexwriter.cc:41
 hmdcvertexwriter.cc:42
 hmdcvertexwriter.cc:43
 hmdcvertexwriter.cc:44
 hmdcvertexwriter.cc:45
 hmdcvertexwriter.cc:46
 hmdcvertexwriter.cc:47
 hmdcvertexwriter.cc:48
 hmdcvertexwriter.cc:49
 hmdcvertexwriter.cc:50
 hmdcvertexwriter.cc:51
 hmdcvertexwriter.cc:52
 hmdcvertexwriter.cc:53
 hmdcvertexwriter.cc:54
 hmdcvertexwriter.cc:55
 hmdcvertexwriter.cc:56
 hmdcvertexwriter.cc:57
 hmdcvertexwriter.cc:58
 hmdcvertexwriter.cc:59
 hmdcvertexwriter.cc:60
 hmdcvertexwriter.cc:61
 hmdcvertexwriter.cc:62
 hmdcvertexwriter.cc:63
 hmdcvertexwriter.cc:64
 hmdcvertexwriter.cc:65
 hmdcvertexwriter.cc:66
 hmdcvertexwriter.cc:67
 hmdcvertexwriter.cc:68
 hmdcvertexwriter.cc:69
 hmdcvertexwriter.cc:70
 hmdcvertexwriter.cc:71
 hmdcvertexwriter.cc:72
 hmdcvertexwriter.cc:73
 hmdcvertexwriter.cc:74
 hmdcvertexwriter.cc:75
 hmdcvertexwriter.cc:76
 hmdcvertexwriter.cc:77
 hmdcvertexwriter.cc:78
 hmdcvertexwriter.cc:79
 hmdcvertexwriter.cc:80
 hmdcvertexwriter.cc:81
 hmdcvertexwriter.cc:82
 hmdcvertexwriter.cc:83
 hmdcvertexwriter.cc:84
 hmdcvertexwriter.cc:85
 hmdcvertexwriter.cc:86
 hmdcvertexwriter.cc:87
 hmdcvertexwriter.cc:88
 hmdcvertexwriter.cc:89
 hmdcvertexwriter.cc:90
 hmdcvertexwriter.cc:91
 hmdcvertexwriter.cc:92
 hmdcvertexwriter.cc:93
 hmdcvertexwriter.cc:94
 hmdcvertexwriter.cc:95
 hmdcvertexwriter.cc:96
 hmdcvertexwriter.cc:97
 hmdcvertexwriter.cc:98
 hmdcvertexwriter.cc:99
 hmdcvertexwriter.cc:100
 hmdcvertexwriter.cc:101
 hmdcvertexwriter.cc:102
 hmdcvertexwriter.cc:103
 hmdcvertexwriter.cc:104
 hmdcvertexwriter.cc:105
 hmdcvertexwriter.cc:106
 hmdcvertexwriter.cc:107
 hmdcvertexwriter.cc:108
 hmdcvertexwriter.cc:109
 hmdcvertexwriter.cc:110
 hmdcvertexwriter.cc:111
 hmdcvertexwriter.cc:112
 hmdcvertexwriter.cc:113
 hmdcvertexwriter.cc:114
 hmdcvertexwriter.cc:115
 hmdcvertexwriter.cc:116
 hmdcvertexwriter.cc:117
 hmdcvertexwriter.cc:118
 hmdcvertexwriter.cc:119
 hmdcvertexwriter.cc:120
 hmdcvertexwriter.cc:121
 hmdcvertexwriter.cc:122
 hmdcvertexwriter.cc:123
 hmdcvertexwriter.cc:124
 hmdcvertexwriter.cc:125
 hmdcvertexwriter.cc:126
 hmdcvertexwriter.cc:127
 hmdcvertexwriter.cc:128
 hmdcvertexwriter.cc:129
 hmdcvertexwriter.cc:130
 hmdcvertexwriter.cc:131
 hmdcvertexwriter.cc:132
 hmdcvertexwriter.cc:133
 hmdcvertexwriter.cc:134
 hmdcvertexwriter.cc:135
 hmdcvertexwriter.cc:136
 hmdcvertexwriter.cc:137
 hmdcvertexwriter.cc:138
 hmdcvertexwriter.cc:139
 hmdcvertexwriter.cc:140
 hmdcvertexwriter.cc:141
 hmdcvertexwriter.cc:142
 hmdcvertexwriter.cc:143
 hmdcvertexwriter.cc:144
 hmdcvertexwriter.cc:145
 hmdcvertexwriter.cc:146
 hmdcvertexwriter.cc:147
 hmdcvertexwriter.cc:148
 hmdcvertexwriter.cc:149
 hmdcvertexwriter.cc:150
 hmdcvertexwriter.cc:151
 hmdcvertexwriter.cc:152
 hmdcvertexwriter.cc:153
 hmdcvertexwriter.cc:154
 hmdcvertexwriter.cc:155
 hmdcvertexwriter.cc:156
 hmdcvertexwriter.cc:157
 hmdcvertexwriter.cc:158
 hmdcvertexwriter.cc:159
 hmdcvertexwriter.cc:160
 hmdcvertexwriter.cc:161
 hmdcvertexwriter.cc:162
 hmdcvertexwriter.cc:163
 hmdcvertexwriter.cc:164
 hmdcvertexwriter.cc:165
 hmdcvertexwriter.cc:166
 hmdcvertexwriter.cc:167
 hmdcvertexwriter.cc:168
 hmdcvertexwriter.cc:169
 hmdcvertexwriter.cc:170
 hmdcvertexwriter.cc:171
 hmdcvertexwriter.cc:172
 hmdcvertexwriter.cc:173
 hmdcvertexwriter.cc:174
 hmdcvertexwriter.cc:175
 hmdcvertexwriter.cc:176
 hmdcvertexwriter.cc:177
 hmdcvertexwriter.cc:178
 hmdcvertexwriter.cc:179
 hmdcvertexwriter.cc:180
 hmdcvertexwriter.cc:181
 hmdcvertexwriter.cc:182
 hmdcvertexwriter.cc:183
 hmdcvertexwriter.cc:184
 hmdcvertexwriter.cc:185
 hmdcvertexwriter.cc:186
 hmdcvertexwriter.cc:187
 hmdcvertexwriter.cc:188
 hmdcvertexwriter.cc:189
 hmdcvertexwriter.cc:190
 hmdcvertexwriter.cc:191
 hmdcvertexwriter.cc:192
 hmdcvertexwriter.cc:193
 hmdcvertexwriter.cc:194
 hmdcvertexwriter.cc:195
 hmdcvertexwriter.cc:196
 hmdcvertexwriter.cc:197
 hmdcvertexwriter.cc:198
 hmdcvertexwriter.cc:199
 hmdcvertexwriter.cc:200
 hmdcvertexwriter.cc:201
 hmdcvertexwriter.cc:202
 hmdcvertexwriter.cc:203
 hmdcvertexwriter.cc:204
 hmdcvertexwriter.cc:205
 hmdcvertexwriter.cc:206
 hmdcvertexwriter.cc:207
 hmdcvertexwriter.cc:208
 hmdcvertexwriter.cc:209
 hmdcvertexwriter.cc:210
 hmdcvertexwriter.cc:211
 hmdcvertexwriter.cc:212
 hmdcvertexwriter.cc:213
 hmdcvertexwriter.cc:214
 hmdcvertexwriter.cc:215
 hmdcvertexwriter.cc:216
 hmdcvertexwriter.cc:217
 hmdcvertexwriter.cc:218
 hmdcvertexwriter.cc:219
 hmdcvertexwriter.cc:220
 hmdcvertexwriter.cc:221
 hmdcvertexwriter.cc:222
 hmdcvertexwriter.cc:223
 hmdcvertexwriter.cc:224
 hmdcvertexwriter.cc:225
 hmdcvertexwriter.cc:226
 hmdcvertexwriter.cc:227
 hmdcvertexwriter.cc:228
 hmdcvertexwriter.cc:229
 hmdcvertexwriter.cc:230
 hmdcvertexwriter.cc:231
 hmdcvertexwriter.cc:232
 hmdcvertexwriter.cc:233
 hmdcvertexwriter.cc:234
 hmdcvertexwriter.cc:235
 hmdcvertexwriter.cc:236
 hmdcvertexwriter.cc:237
 hmdcvertexwriter.cc:238
 hmdcvertexwriter.cc:239
 hmdcvertexwriter.cc:240
 hmdcvertexwriter.cc:241
 hmdcvertexwriter.cc:242
 hmdcvertexwriter.cc:243
 hmdcvertexwriter.cc:244
 hmdcvertexwriter.cc:245
 hmdcvertexwriter.cc:246
 hmdcvertexwriter.cc:247
 hmdcvertexwriter.cc:248
 hmdcvertexwriter.cc:249
 hmdcvertexwriter.cc:250
 hmdcvertexwriter.cc:251
 hmdcvertexwriter.cc:252
 hmdcvertexwriter.cc:253
 hmdcvertexwriter.cc:254
 hmdcvertexwriter.cc:255
 hmdcvertexwriter.cc:256
 hmdcvertexwriter.cc:257
 hmdcvertexwriter.cc:258
 hmdcvertexwriter.cc:259
 hmdcvertexwriter.cc:260
 hmdcvertexwriter.cc:261
 hmdcvertexwriter.cc:262
 hmdcvertexwriter.cc:263
 hmdcvertexwriter.cc:264
 hmdcvertexwriter.cc:265
 hmdcvertexwriter.cc:266
 hmdcvertexwriter.cc:267
 hmdcvertexwriter.cc:268
 hmdcvertexwriter.cc:269
 hmdcvertexwriter.cc:270
 hmdcvertexwriter.cc:271
 hmdcvertexwriter.cc:272
 hmdcvertexwriter.cc:273
 hmdcvertexwriter.cc:274
 hmdcvertexwriter.cc:275
 hmdcvertexwriter.cc:276
 hmdcvertexwriter.cc:277
 hmdcvertexwriter.cc:278
 hmdcvertexwriter.cc:279
 hmdcvertexwriter.cc:280
 hmdcvertexwriter.cc:281
 hmdcvertexwriter.cc:282
 hmdcvertexwriter.cc:283
 hmdcvertexwriter.cc:284
 hmdcvertexwriter.cc:285
 hmdcvertexwriter.cc:286
 hmdcvertexwriter.cc:287
 hmdcvertexwriter.cc:288
 hmdcvertexwriter.cc:289
 hmdcvertexwriter.cc:290
 hmdcvertexwriter.cc:291
 hmdcvertexwriter.cc:292
 hmdcvertexwriter.cc:293
 hmdcvertexwriter.cc:294
 hmdcvertexwriter.cc:295
 hmdcvertexwriter.cc:296
 hmdcvertexwriter.cc:297
 hmdcvertexwriter.cc:298
 hmdcvertexwriter.cc:299
 hmdcvertexwriter.cc:300
 hmdcvertexwriter.cc:301
 hmdcvertexwriter.cc:302
 hmdcvertexwriter.cc:303
 hmdcvertexwriter.cc:304
 hmdcvertexwriter.cc:305
 hmdcvertexwriter.cc:306
 hmdcvertexwriter.cc:307
 hmdcvertexwriter.cc:308
 hmdcvertexwriter.cc:309
 hmdcvertexwriter.cc:310
 hmdcvertexwriter.cc:311
 hmdcvertexwriter.cc:312
 hmdcvertexwriter.cc:313
 hmdcvertexwriter.cc:314
 hmdcvertexwriter.cc:315
 hmdcvertexwriter.cc:316
 hmdcvertexwriter.cc:317
 hmdcvertexwriter.cc:318
 hmdcvertexwriter.cc:319
 hmdcvertexwriter.cc:320
 hmdcvertexwriter.cc:321
 hmdcvertexwriter.cc:322
 hmdcvertexwriter.cc:323
 hmdcvertexwriter.cc:324
 hmdcvertexwriter.cc:325
 hmdcvertexwriter.cc:326
 hmdcvertexwriter.cc:327
 hmdcvertexwriter.cc:328
 hmdcvertexwriter.cc:329
 hmdcvertexwriter.cc:330
 hmdcvertexwriter.cc:331
 hmdcvertexwriter.cc:332
 hmdcvertexwriter.cc:333
 hmdcvertexwriter.cc:334
 hmdcvertexwriter.cc:335
 hmdcvertexwriter.cc:336
 hmdcvertexwriter.cc:337
 hmdcvertexwriter.cc:338
 hmdcvertexwriter.cc:339
 hmdcvertexwriter.cc:340
 hmdcvertexwriter.cc:341
 hmdcvertexwriter.cc:342
 hmdcvertexwriter.cc:343
 hmdcvertexwriter.cc:344
 hmdcvertexwriter.cc:345
 hmdcvertexwriter.cc:346
 hmdcvertexwriter.cc:347
 hmdcvertexwriter.cc:348
 hmdcvertexwriter.cc:349
 hmdcvertexwriter.cc:350
 hmdcvertexwriter.cc:351
 hmdcvertexwriter.cc:352
 hmdcvertexwriter.cc:353
 hmdcvertexwriter.cc:354
 hmdcvertexwriter.cc:355
 hmdcvertexwriter.cc:356
 hmdcvertexwriter.cc:357
 hmdcvertexwriter.cc:358
 hmdcvertexwriter.cc:359
 hmdcvertexwriter.cc:360
 hmdcvertexwriter.cc:361
 hmdcvertexwriter.cc:362
 hmdcvertexwriter.cc:363
 hmdcvertexwriter.cc:364
 hmdcvertexwriter.cc:365
 hmdcvertexwriter.cc:366
 hmdcvertexwriter.cc:367
 hmdcvertexwriter.cc:368
 hmdcvertexwriter.cc:369
 hmdcvertexwriter.cc:370
 hmdcvertexwriter.cc:371
 hmdcvertexwriter.cc:372
 hmdcvertexwriter.cc:373
 hmdcvertexwriter.cc:374
 hmdcvertexwriter.cc:375
 hmdcvertexwriter.cc:376
 hmdcvertexwriter.cc:377
 hmdcvertexwriter.cc:378
 hmdcvertexwriter.cc:379
 hmdcvertexwriter.cc:380
 hmdcvertexwriter.cc:381
 hmdcvertexwriter.cc:382
 hmdcvertexwriter.cc:383
 hmdcvertexwriter.cc:384
 hmdcvertexwriter.cc:385
 hmdcvertexwriter.cc:386
 hmdcvertexwriter.cc:387
 hmdcvertexwriter.cc:388
 hmdcvertexwriter.cc:389
 hmdcvertexwriter.cc:390
 hmdcvertexwriter.cc:391
 hmdcvertexwriter.cc:392
 hmdcvertexwriter.cc:393
 hmdcvertexwriter.cc:394
 hmdcvertexwriter.cc:395
 hmdcvertexwriter.cc:396
 hmdcvertexwriter.cc:397
 hmdcvertexwriter.cc:398