2 Contact: cvetan.cheshkov@cern.ch
6 Number of events needed: 10000
9 Trigger types used: PHYSICS
18 #define OUTPUT_FILE "SPDVertexDiamondDA.root"
19 #define CDB_STORAGE "local://$ALICE_ROOT"
20 #define N_EVENTS_AUTOSAVE 50
32 int amore::da::Updated(char const*) {}
40 #include <TPluginManager.h>
44 #include "AliRawReaderDate.h"
45 #include "AliGeomManager.h"
46 #include "AliCDBManager.h"
47 #include "AliESDVertex.h"
48 #include "AliITSDetTypeRec.h"
49 #include "AliITSInitGeometry.h"
50 #include "AliITSVertexer3DTapan.h"
54 AliESDVertex* FitVertexDiamond(TH2F *hXY, TH1F *hZ);
56 int main(int argc, char **argv) {
58 gROOT->GetPluginManager()->AddHandler("TVirtualStreamerInfo",
63 TFitter *minuitFit = new TFitter(NFITPARAMS);
64 TVirtualFitter::SetFitter(minuitFit);
68 printf("Wrong number of arguments\n");
72 /* define data source : this is argument 1 */
73 status=monitorSetDataSource( argv[1] );
75 printf("monitorSetDataSource() failed : %s\n",monitorDecodeError(status));
79 /* declare monitoring program */
80 status=monitorDeclareMp( __FILE__ );
82 printf("monitorDeclareMp() failed : %s\n",monitorDecodeError(status));
86 /* define wait event timeout - 1s max */
88 monitorSetNoWaitNetworkTimeout(1000);
90 /* log start of process */
91 printf("Vertex-Diamond SPD DA started\n");
93 /* init some counters */
94 int nevents_with_vertex = 0;
95 int nevents_physics=0;
98 struct eventHeaderStruct *event;
102 if (getenv("DATE_RUN_NUMBER")==0) {
103 printf("DATE_RUN_NUMBER not properly set.\n");
106 int runNr = atoi(getenv("DATE_RUN_NUMBER"));
108 // Histograms initialization
109 TH2F *hXY = new TH2F("hXY","Vertex Diamond (Y vs X)",
110 2*(Int_t)(X_LIMIT/X_DELTA),-X_LIMIT,X_LIMIT,
111 2*(Int_t)(Y_LIMIT/Y_DELTA),-Y_LIMIT,Y_LIMIT);
112 TH1F *hZ = new TH1F("hZ"," Longitudinal Vertex Profile",
113 2*(Int_t)(Z_LIMIT/Z_DELTA),-Z_LIMIT,Z_LIMIT);
115 // Global initializations
116 AliCDBManager *man = AliCDBManager::Instance();
117 man->SetDefaultStorage(CDB_STORAGE);
119 AliGeomManager::LoadGeometry("geometry.root");
120 AliGeomManager::ApplyAlignObjsFromCDB("ITS");
122 // ITS initializations
123 AliITSInitGeometry initgeom;
124 AliITSgeom *geom = initgeom.CreateAliITSgeom();
125 printf("Geometry name: %s\n",(initgeom.GetGeometryName()).Data());
127 AliITSDetTypeRec *detTypeRec = new AliITSDetTypeRec();
128 detTypeRec->SetITSgeom(geom);
129 detTypeRec->SetDefaults();
130 detTypeRec->SetDefaultClusterFindersV2(kTRUE);
132 // Initialization of AMORE sender
134 amore::da::AmoreDA vtxAmore(amore::da::AmoreDA::kSender);
136 /* main loop (infinite) */
139 /* check shutdown condition */
140 if (daqDA_checkShutdown()) {break;}
142 /* get next event (blocking call until timeout) */
143 status=monitorGetEventDynamic((void **)&event);
144 if (status==MON_ERR_EOF) {
145 printf ("End of File detected\n");
146 break; /* end of monitoring file has been reached */
150 printf("monitorGetEventDynamic() failed : %s\n",monitorDecodeError(status));
154 /* retry if got no event */
160 eventT=event->eventType;
161 switch (event->eventType){
166 /* END START OF RUN */
174 AliRawReader *rawReader = new AliRawReaderDate((void*)event);
176 // Run SPD cluster finder
177 TTree* clustersTree = new TTree("TreeR", "Reconstructed Points Container"); //make a tree
178 detTypeRec->DigitsToRecPoints(rawReader,clustersTree,"SPD");
181 AliITSVertexer3DTapan *vertexer = new AliITSVertexer3DTapan(geom,1000);
182 vertexer->LoadClusters(clustersTree);
183 AliESDVertex *vtx = new AliESDVertex();
184 vertexer->FindVertexForCurrentEvent(vtx);
186 if (TMath::Abs(vtx->GetChi2()) < 0.1) {
187 // Fill the vertex into the histos
188 nevents_with_vertex++;
189 hXY->Fill(vtx->GetXv(),vtx->GetYv());
190 hZ->Fill(vtx->GetZv());
193 if ((nevents_with_vertex%N_EVENTS_AUTOSAVE) == 0) {
194 TFile outFile(OUTPUT_FILE, "update");
195 AliESDVertex *fitVtx = FitVertexDiamond(hXY,hZ);
197 fitVtx->Write(fitVtx->GetName(),TObject::kOverwrite);
198 TH1 *fithXY = fitFcn->CreateHistogram();
199 fithXY->Write(fithXY->GetName(),TObject::kOverwrite);
202 hXY->Write(hXY->GetName(),TObject::kOverwrite);
203 hZ->Write(hZ->GetName(),TObject::kOverwrite);
220 /* exit when last event received, no need to wait for TERM signal */
221 if (eventT==END_OF_RUN) {
222 printf("EOR event detected\n");
227 if (detTypeRec) delete detTypeRec;
229 // Store the final histograms
230 TFile outFile(OUTPUT_FILE, "update");
231 if (nevents_with_vertex > N_EVENTS_AUTOSAVE) {
232 // Fit XY & Z histograms
233 AliESDVertex *fitVtx = FitVertexDiamond(hXY,hZ);
235 fitVtx->Write(fitVtx->GetName(),TObject::kOverwrite);
236 TH1 *fithXY = fitFcn->CreateHistogram();
237 fithXY->Write(fithXY->GetName(),TObject::kOverwrite);
242 hXY->Write(hXY->GetName(),TObject::kOverwrite);
243 hZ->Write(hZ->GetName(),TObject::kOverwrite);
247 // send the histos to AMORE pool
248 printf("AMORE send status: %d",vtxAmore.Send(hXY->GetName(),hXY));
252 TVirtualFitter::SetFitter(0);
255 printf("Run #%s, received %d events with vertex, out of %d physics and out of %d total events\n",getenv("DATE_RUN_NUMBER"),nevents_with_vertex,nevents_physics,nevents_total);
259 /* export file to FXS */
260 if (daqDA_FES_storeFile(OUTPUT_FILE, "VertexDiamond")) {
267 Double_t fitFunction(Double_t *x, Double_t *par) {
269 Double_t t1 = x[0] - par[1];
270 Double_t t2 = x[1] - par[2];
272 return par[0]*TMath::Exp(-0.5*(t1*t1/(par[3]*par[3])+t2*t2/(par[4]*par[4])));
275 AliESDVertex* FitVertexDiamond(TH2F *hXY, TH1F *hZ)
279 fitFcn = new TF2("fitFcn",fitFunction,
281 -Y_LIMIT,Y_LIMIT,NFITPARAMS);
282 fitFcn->SetNpx(2*(Int_t)(X_LIMIT/X_DELTA));
283 fitFcn->SetNpy(2*(Int_t)(Y_LIMIT/Y_DELTA));
284 fitFcn->SetParameters(hXY->GetMaximum(),0,0,hXY->GetRMS(1),hXY->GetRMS(2));
288 if (hXY->Fit("fitFcn","L0V+") != 0) {
289 printf("XY fit failed!");
293 Double_t pos[3],poserr[3];
294 pos[0] = fitFcn->GetParameter(1);
295 pos[1] = fitFcn->GetParameter(2);
296 poserr[0] = fitFcn->GetParameter(3);
297 poserr[1] = fitFcn->GetParameter(4);
299 // Could be replaced by something more robust...
300 pos[2] = hZ->GetMean();
301 poserr[2] = hZ->GetRMS();
303 return new AliESDVertex(pos,poserr);